Promon 公司的安全研究员最近发现了一个影响所有安卓版本(包括最新的 Android 10)的危险 0day,并将其命名为“StrandHogg”。全球最受欢迎的前500款应用全部不幸躺枪。该漏洞已遭利用,而90天期限过后,谷歌仍未将其修复。要命的是,无需 root 权限就能利用该漏洞,而用户根本无法判断自己是否遭攻击,束手无策。于是,研究员将该 0day 详情曝光。奇安信代码卫士团队将该漏洞的详情翻译如下:Promon 公司的安全研究员发现了一个危险的安卓漏洞 “StrandHogg”,可导致真实的恶意软件伪装成合法 app,而遭攻击的用户对此一无所知。该漏洞被命名为 “StrandHogg”的原因是,大概公元9世纪至13世纪,在斯堪的纳维亚及其海外殖民地使用的古斯堪的那维亚语中,这个词是描述维京人的一种战术:突袭沿海地区掠夺并扣押人员(一般手无寸铁)获取赎金。维京人当时就建立起间谍网络,知晓宗教盛宴和活动、当地风俗以及具有勒索价值的高价值人群,从而能够选择下次的攻击地区。而当代的网络犯罪分子就像是维京人。
- 影响所有安卓版本,包括 Android 10 在内(注意:权限收集利用仅影响 Android 6.0 及后续版本)
- 已发现36款利用该漏洞的恶意应用(Lookout 公司已确认,且表示其中在2017年出现的 BankBot 银行木马的变体也在利用该漏洞)
恶意 app 利用 StrandHogg 漏洞伪装成合法 app 要求获取权限。攻击者可以请求访问任意权限,包括 SMS、照片、麦克风和GPS信息,从而读取信息、查看照片、窃听并追踪受害者。该攻击可以请求的权限是不同的目标应用一般会请求的权限,借此来降低受害者的猜疑。用户并未意识到正在将权限授予黑客而非自认为的合法应用。
安装在设备上的恶意 app 利用该漏洞后能够攻击设备并诱骗设备,这样当用户点击合法 app 的图标时,打开的实际上是恶意版本。当用户在这个恶意界面输入凭证后,敏感信息就立即被发送给攻击者。后者之后可以实施登录并控制应用。StrandHogg 的独特之处在于它无需 root 设备就能发动复杂攻击。它使用的是安卓多任务系统中的一个弱点来发动强大的攻击,可导致恶意应用伪装成设备上的任意应用。这种利用基于安卓的控制设置 “taskAffinity”。该设置允许包括恶意 app 在内的任意 app 自由地在多任务系统中假设为任何身份。研究员对利用这个严重缺陷的真实恶意软件进行了研究,结果发现所有500款顶级应用(依据42 Matters 排名)都存在风险,所有的安卓版本均受影响。这次研究大大扩展了美国宾夕法尼亚州大学在2015年开展的一项研究。当时研究人员从理论上描述了该漏洞的某些情况。虽然目前谷歌降低了该漏洞的严重性,但Promon 公司掌握的实际证据表明,黑客正在利用 StrandHogg 获取对设备和应用的权限。Promon 公司分析的这个具体的恶意软件样本并不存在于谷歌应用商店中,而是通过谷歌应用商店上多种释放器应用/有害的下载器(即具有或加装具有流行应用的功能的app,它们还会下载额外的或恶意的应用或者窃取用户数据)被安装到用户设备上。虽然这些应用目前已被删除,但是尽管谷歌采取了 Play Protect 安全套件,释放器应用仍然被发布在应用商店中且常常在谷歌眼皮子底下开溜,其中一些在被删除之前的下载量已达到数百万次。谷歌应用商店上释放器类 app 的规模之大可以从研究员最近报告的恶意 CamScanner app 中窥见一斑。该 app 是一款 PDF 创建器,包含一个恶意模块,已被下载一亿多次。我们首次发现恶意软件利用 StrandHogg 漏洞作为一种主要策略。恶意软件本身并不存在于谷歌应用商店中,而是通过多种敌对下载器即发布在谷歌应用商店中的恶意应用进行安装。
恶意 app 将其中一种或多种活动的 taskAffinity 设置为匹配任何第三方 app 的 packageName。之后通过结合 manifest 中的 allowTaskReparenting=”true” 或者通过 Intent.FLAG_ACTIVITY_NEW_TASK的 intent-flag 发布活动,该恶意活动将被放在目标任务的内部和顶部。如此,该恶意活动劫持目标任务。下一次当目标 app 再次从启动栏启动时,遭劫持的任务将出现在前端而恶意活动也会现身。之后恶意 app 只需要伪装成目标 app 就能够发动复杂攻击。这种劫持甚至会发生在目标 app 被安装之前。StrandHogg 存在于安卓多任务处理系统任务之间的多种活动及其动作中心。通过 android.app.Activity#startActivities(android.content.Intent[])同时启动两种(或多种)活动,可能同时发动攻击以及看似无害的活动。在后台,甚至先于用户看到屏幕活动,攻击就准备并劫持目标。除了在某些设备上会出现某些微小翻动外,用户看到的都将只是良性活动,而且根本不知道恶意活动已发生。我们看下 adb shell dumpsysactivity activities 的输出结果就会发现攻击活动已经就位,一直待到该 app 下次启动时。确实,当下次启动受害者 app (点击图标)时,我们看到的是攻击者而非受害者。
还有一个属性 allowTaskReparenting,当使用时它不会立即将攻击者活动传输给目标,而是在下次启动目标任务后,安卓操作系统会评估所有的任务和活动并查找标有该属性的活动并在发布相关任务之前移动它们。同时,每种活动都具有关于自身任务和所属 taskID 的信息。攻击活动可通过这种信息判断它位于什么任务中,之后立即在屏幕上显示相应的或恶意或良性内容。
尤其令人震惊的是,攻击者能够获得对受害者任务的重大控制。通过结合 Intent#FLAG_ACTIVITY_NEW_TASK 和 Intent#FLAG_ACTIVITY_CLEAR_TASK,攻击者首先清空目标任务然后启动。该活动随后可以通过 android.app.Activity#finishAndRemoveTask完成目标任务并发动一个新任务。该新任务与Intent#FLAG_ACTIVITY_NEW_TASK 和Intent#FLAG_ACTIVITY_CLEAR_TASK 具有相同的关系 (affinity),从而保证新的目标任务受攻击者控制。之后,攻击者就能够启动受害者实际的启动器活动,并让受害者的 app 像往常一样运行。同时,由于攻击者仍然保留对受害者任务的控制权,因此就掌握了关于该目标状态的更多信息。之后可能会拦截并在目标应用程序的流中注入钓鱼活动,而这种流对用户以及目标 app流来说更自然得无懈可击。
Promon 公司的研究员早在今年夏天就按照谷歌的90天披露时间轴将问题告知谷歌。虽然谷歌已删除受影响应用,但就研究人员所知,该漏洞尚未在任何安卓版本中得到修复(包括Andorid 10 在内)。用户能检测出设备上是否存在 StrandHogg 吗?一般来说,用户无法检测出该漏洞。设备上不具备针对该漏洞的有效的拦截甚至是可靠的检测方法。用户如遇到以下情况,则可能说明已遭攻击:- App 请求的权限是不应当要求的或需要的权限。例如,计算器 app 要求获取 GPS 权限的情况。
从最近打开的屏幕中关闭该 app 可能会起作用。然而,攻击者也可能绕过这种做法。用户可以通过 USB 连接手机并运行 adb shell dumpsys activity activities,它将告诉你所有可见屏幕的技术列表,以及它们目前在执行何种任务和这些任务属于哪款 app。然而这种方法需要具备一定的技术知识以及需要了解查找哪些内容。能检测到是否有人在利用 StrandHogg 攻击我的app 吗?我们可以通过 Android SDK 获取一些基本的任务信息。然而,鉴于任务的本质,不在前端显示的活动(因此所有应用)可能甚至不会运行。因此你的app 可能在未运行的情况下就已遭劫持。安卓中并不存在回调或播报机制,因此无法在用户任务遭劫持的情况下发出通知,导致用户必须在后台持续运行监控服务。值得注意的是,恶意软件或攻击者无需以任何方式修改、更改或触摸你的应用就能攻击你的应用。因此,监控app的变化、执行重新包装/签名检查等无法拦截 StrandHogg。良性 app 的开发人员在 AndroidManifestxml 的应用程序标签中将所有活动的任务关系 (task affinity) 设置为 “”(空字符串)来说明良性 app 的活动和任何任务都没有关系。但这只能从一定程度上缓解该风险。
https://promon.co/security-news/strandhogg/
本文由奇安信代码卫士编译,不代表奇安信观点,转载请注明“转自奇安信代码卫士 www.codesafe.cn”
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。